#include "process.h"


/*------------------------宏定义------------------------*/
//1.定义进度条填充的字符样式
#define STYLE '=' //注意：STYLE是字符，所以=需要加上单引号
//2.定义缓冲区大小
#define NUM 101  ///注意：+1 是为了容纳字符串结束符 '\0'

/*------------------------version1版本的进度条------------------------*/
//功能：简单的固定次数进度条实现函数
void process_v1()
{
	/*----------------准备阶段----------------*/
	//1.用于存储进度条字符的数组
	char buffer[NUM];
	//2.将数组中的所有字节初始化为 0
	memset(buffer, 0, sizeof(buffer));


	//3.定义进度条旋转的指示字符数组，模拟进度条的动态效果
	const char* lable = "|/-\\"; //细节：由于单独一个'\'是转移字符，所以想要'反斜杠\'需要加两个\
	//4.获取指示字符数组的长度
	int len = strlen(lable);


	/*----------------打印阶段----------------*/
	int cnt = 0;
	while (cnt <= 100)
	{
		//第一步：打印进度条
		printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt % len]);

		/*  细节分析：
		*		%-100s：表示左对齐，占 100 个字符宽度的字符串（进度条主体）---> 值得细细品味
		*		[%d%%]：表示当前进度的百分比数值
		*		[%c]：  表示当前旋转的指示字符
		*		\r：    是回车符，将光标移到当前行开头，实现覆盖输出，让进度条在同一行更新
		*/

		//第二步：刷新标准输出缓冲区
		fflush(stdout);

		//多加一步：向缓冲区中添加一个进度条样式字符
		buffer[cnt] = STYLE;

		//第三步：让程序休眠：50000 微秒（0.05 秒）
		usleep(50000);

		//第四步：更新循环因子
		cnt++;
	}
	
	printf("\n"); //小细节：进度条完成后，输出一个换行符，使光标移到下一行
}



/*------------------------version2版本的进度条------------------------*/
void process_v2(double total, double current)
{
	/*----------------准备一阶段----------------*/
	//1.用于存储进度条字符的数组
	char buffer[NUM];
	//2.将数组中的所有字节初始化为 0
	memset(buffer, 0, sizeof(buffer));


	//3.定义进度条旋转的指示字符数组，模拟进度条的动态效果
	const char* lable = "|/-\\"; //细节：由于单独一个'\'是转移字符，所以想要'反斜杠\'需要加两个\
	//4.获取指示字符数组的长度
	int len = strlen(lable);


	/*----------------准备二阶段----------------*/
	//1.定义静态变量 ---> 用于记录旋转指示字符的位置，程序运行过程中保持值不变（跨函数调用）
	static int cnt = 0;

	//2.旋转指示字符的位置取模，实现循环旋转效果
	cnt = cnt % len;

	//3.计算当前进度的百分比 ---> 乘以 100 后取整
	int num = (int)(current * 100 / total);

	//4.根据进度百分比向缓冲区填充进度条样式字符
	for (int i = 0; i < num; i++)
	{
		buffer[i] = STYLE;
	} 

	//5.计算进度的比例（0 到 1 之间的小数）
	double rate = current / total;


	/*----------------打印阶段----------------*/
	//第一步：打印进度条
	printf("[%-100s][%.1f%%][%c]\r", buffer, rate * 100, lable[cnt]);
	/*  细节分析：
	*		%-100s：进度条主体
	*		[%.1f%%]：进度百分比，保留 1 位小数
	*		[%c]：旋转的指示字符
	*		\r：回车符，实现覆盖输出
	*/

	//第二步：刷新标准输出缓冲区
	fflush(stdout);

	//第三步：更新循环因子 ---> 旋转指示字符的位置加 1，为下次旋转做准备
	cnt++;
}

